package team.hyznrj.studentsys.service;

import java.util.List;
import java.util.Map;

import com.mongodb.BasicDBObject;
import com.mongodb.WriteResult;

import team.hyznrj.studentsys.dto.StudentMessageSearchDto;
import team.hyznrj.studentsys.entity.DataReport;
import team.hyznrj.studentsys.entity.StudentMsgMap;
import team.hyznrj.studentsys.exception.AuthenticationOnFlagException;
import team.hyznrj.studentsys.exception.DataBaseObjectNull;
import team.hyznrj.studentsys.exception.DataBaseOperationError;
import team.hyznrj.studentsys.exception.DataNullException;

public interface StudentMessageService {
	/**
	 * 获取该学院 某个字段对应的聚合信息
	 * @return
	 */
	List<String> getAggregateKeyWords(String keyWords,String flag);
	
	/**
	 * 根据查询条件获取学生学号（数组）
	 * @param dto
	 * @return
	 */
	List<String> getPIDByKeywords(StudentMessageSearchDto dto);
	/**
	 * 根据id获取学号
	 * @param ids 系统自动生成的编号
	 * @return
	 */
	List<String> getSnoByIds(List<String> ids,String flag);
	
	/**
	 * 增加一个学生的信息（键值对方式,necessary的项必须添加,其他为可选项）
	 * 无论如何，存入mongDB的形式为String:String
	 * @param message
	 * @return
	 * @return DataReport
	 * @throws DataNullException 
	 * @throws DataBaseObjectNull 
	 * @throws AuthenticationOnFlagException 
	 */
	Object addMsg(Map<String,String> message,String flag) throws DataNullException, DataBaseObjectNull, AuthenticationOnFlagException;
	/**
	 * 增加多个学生的信息(批量操作)（键值对方式,necessary的项必须添加,其他为可选项）
	 * 无论如何，存入mongDB的形式为String:String
	 * @param message
	 * @return
	 * @return DataReport
	 * @throws DataNullException 
	 * @throws DataBaseObjectNull 
	 * @throws AuthenticationOnFlagException 
	 */
	
	Object addMsgMulity(List<Map<String,String>> message,String flag) throws DataNullException, DataBaseObjectNull, AuthenticationOnFlagException;
	
	/**
	 * 删除学生的信息(键值对方式,不能为空).
	 * 此处包括了单条(学号)和多条(班级等)信息的删除,
	 * deleteMsg  
	 * @param list 数据库字段映射列表
	 * @param message 需要删除的信息
	 * @param flag 指定哪个学院
	 * @return
	 * @return DataReport
	 * @throws DataNullException 
	 * @throws DataBaseOperationError 
	 * @throws AuthenticationOnFlagException 
	 */
	int deleteMsg(Map<String,String> message,String flag) throws DataNullException, DataBaseOperationError, AuthenticationOnFlagException;
	/**
	 * 删除学生的信息(通过id)
	 * deleteMsg  
	 * @param idList _id数组
	 * @param flag 指定哪个学院
	 * @return
	 * @return DataReport
	 * @throws DataNullException 
	 * @throws DataBaseOperationError 
	 * @throws AuthenticationOnFlagException 
	 */
	WriteResult deleteMsg(List<String> idList,String flag) throws DataNullException, DataBaseOperationError, AuthenticationOnFlagException;
	
	/**
	 * 修改学生的信息
	 * 此处包括了单条(学号)和多条(班级等)信息的修改,
	 * 这种更新方式是覆盖式的更新
	 * 必须包含所有必要字段
	 * updateMsg  
	 * @param conditions 更新条件,_id则单一更新，其他情况为多条件更新
	 * @param newMessage 需要更新的信息
	 * @param flag 指定哪个学院
	 * @return
	 * @return DataReport
	 * @throws DataNullException 
	 * @throws DataBaseOperationError 
	 * @throws DataBaseObjectNull 
	 * @throws AuthenticationOnFlagException 
	 */
	WriteResult updateMsg(Map<String,String> conditions,Map<String,String> newMessage,String flag) throws DataNullException, DataBaseOperationError, DataBaseObjectNull, AuthenticationOnFlagException;
	/**
	 * 批量更新
	 * @param idList 需要更新的信息的_id 数组
	 * @param newMessage 需要更新的内容
	 * @param flag 更新域
	 * @return
	 * @throws DataNullException
	 * @throws DataBaseOperationError
	 * @throws DataBaseObjectNull
	 * @throws AuthenticationOnFlagException
	 */
	String updateMsgByKeyList(List<String> idList,Map<String,String> newMessage,String flag) throws DataNullException, DataBaseOperationError, DataBaseObjectNull, AuthenticationOnFlagException;
	
	/**
	 * <p>2018年7月23日 </p>
	 * 请使用: {@link team.hyznrj.studentsys.service.StudentMessageService#getMsgByIds(List, String)}
	 * <p></p>
	 * 查询学生的信息
	 * 此处包括了单条(学号)和多条(班级等)信息的查询（精确查询）
	 * @param condition : 键：1,2,3....   值:value1,value2,value3...,表示需要查询的条件
	 * @param flag 指定哪个学院,如果是 a#b#c#的形式会获取a#b,如果是a##的形式则为a#,左查询(即实现学院查询)
	 * @param direction 为true时表示精准的左查询，否则为模糊查询
	 * @return
	 * @return DataReport
	 * @throws DataBaseOperationError 
	 * @throws DataNullException 
	 * @throws AuthenticationOnFlagException 
	 * 
	 */
	@Deprecated
	List<BasicDBObject> getMsg(Map<String,String> condition,String flag,boolean direction) throws DataBaseOperationError, DataNullException, AuthenticationOnFlagException;
	/**
	 * 通过主键查询学生信息
	 * @param sno
	 * @param flag
	 * @return
	 */
	List<BasicDBObject> getMsgByIds(List<String> ids,String flag);
	
	/**
	 * 多条件查询学生学号:
	 * 学院、专业、班级、姓名
	 * @param condition
	 * 例如:
	 * 学院->数计学院
	 * 专业->软件工程
	 * 班级->1163
	 * @param flag 用户标识符
	 */
	List<BasicDBObject> getStudentsSno(StudentMessageSearchDto dto);
	/**
	 * 记录计数
	 * @param dto
	 * @return
	 * @see getStudentsSno
	 */
	long getStudentsSnoCount(StudentMessageSearchDto dto);
}
